#include <iostream>
#include <fstream>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <algorithm>

using namespace std;

ostream &operator<<(ostream &salida, const vector<int> &v) {
	unsigned int size = v.size();
	for(unsigned int i = 0; i < size; i++) {
		salida << v[i];
		
		if(i != (size - 1))
			salida << " ";
	}
	
	return salida;
}

void generarCiclo( ostream &salida ) {
	vector<int> votaciones;
	int gMin = 3, gMax = 20;
	
	srand( time( 0 ) );
	
	for ( int candidatos = gMin; candidatos <= gMax; candidatos++ ) {
		int votantes = candidatos;
		
		for (int i = 1; i <= candidatos ; i++) votaciones.push_back(i);
		
		for( int candidato_actual = 1; candidato_actual <= candidatos; candidato_actual++) {
			salida << candidatos << " " << votantes << " " << candidato_actual << endl;
			
			for(int i = 0; i < votantes; i++) {
				salida << votaciones << endl;
				
				votaciones.insert(votaciones.begin(), votaciones.back());
				votaciones.pop_back();
			}
		}
		
		votaciones.clear();
	}
	
	salida << "0 0 0" << endl;
}

void generarUnoAislado( ostream &salida ) {
	vector<int> votaciones1, votaciones2;
	
	int gMin = 3, gMax = 20;
	
	srand( time( 0 ) );
	
	for ( int candidatos = gMin; candidatos <= gMax; candidatos++ ) {
		int votantes = (rand() % 10)* 2;
		
		for (int i = 1; i <= candidatos ; i++) votaciones1.push_back(i);
			
		votaciones2.push_back(candidatos);
		for (int i = 1; i < candidatos ; i++) votaciones2.push_back(i);
		
		int candidato_actual = 1;
		salida << candidatos << " " << votantes << " " << candidato_actual << endl;
		
		for(int i = 0; i < votantes; i++) {
			if(i % 2 == 0)
				salida << votaciones1 << endl;
			else
				salida << votaciones2 << endl;
		}
		
		candidato_actual = candidatos;
		salida << candidatos << " " << votantes << " " << candidato_actual << endl;
		
		for(int i = 0; i < votantes; i++) {
			if(i % 2 == 0)
				salida << votaciones1 << endl;
			else
				salida << votaciones2 << endl;
		}
		
		votaciones1.clear();
		votaciones2.clear();
	}
	
	salida << "0 0 0" << endl;
}

void generarAislados( ostream &salida ) {
	vector<int> votaciones1, votaciones2;
	
	int gMin = 2, gMax = 20;
	
	srand( time( 0 ) );
	
	for ( int candidatos = gMin; candidatos <= gMax; candidatos++ ) {
		int votantes = (rand() % 10)* 2;
		for (int i = 1; i <= candidatos ; i++){
			votaciones1.push_back(i);
			votaciones2.push_back(candidatos + 1 - i);
		}
		
		for( int candidato_actual = 1; candidato_actual <= candidatos; candidato_actual++) {
			salida << candidatos << " " << votantes << " " << candidato_actual << endl;
			
			for(int i = 0; i < votantes; i++) {
				if(i % 2 == 0)
					salida << votaciones1 << endl;
				else
					salida << votaciones2 << endl;
			}
		}
		
		votaciones1.clear();
		votaciones2.clear();
	}
	
	salida << "0 0 0" << endl;
}

int main() {
	ofstream salida( "e3-correctitud-aislados.txt" );
	generarAislados(salida);
	salida.close();
	
	salida.open( "e3-correctitud-unoaislado.txt" );
	generarUnoAislado(salida);
	salida.close();
	
	salida.open( "e3-correctitud-ciclo.txt" );
	generarCiclo(salida);
	salida.close();
	
	return 0;
}